Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - [Assembler MIPS]
Forum - Altri Linguaggi - [Assembler MIPS]

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
DidyMond (Normal User)
Newbie


Messaggi: 16
Iscritto: 22/02/2010

Segnala al moderatore
Postato alle 17:57
Lunedì, 24/05/2010
Ciao ragazzi!
Vorrei chiedere un parere su questo linguaggio...
Io dovrei acquisire una stringa messa dall'utente solo che non mi è molto chiaro dove va a finire tale stringa cioè, io acquisisco la sringa in questo modo:

Codice sorgente - presumibilmente Plain Text

  1. .data
  2. stringa: .space 50
  3.  
  4. [...cut codice...]
  5.  
  6. li $v0,8       # Predispone la lettura da tastiera
  7. la $a0,stringa  
  8. li $a1,50
  9. syscall



Quello che mi serve a me, se ho capito finisce in $a0, ma come faccio a riempire un array?
E se poi devo stampare queste stringhe come faccio? Non posso usare il metodo 4 del system service per stampare questa stringa...

Sbaglio io a capire?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:18
Lunedì, 24/05/2010
Testo quotato

Postato originariamente da DidyMond:
Quello che mi serve a me, se ho capito finisce in $a0



$a0 conterrà l'indirizzo del primo carattere della stringa che ti serve. La stringa di per se è da qualche parte in memoria.

Testo quotato


ma come faccio a riempire un array?



Puoi usare la syscall #9

Testo quotato


sbrk       9       number of bytes ($a0)       address of block ($v0)



http://www.d.umn.edu/~gshute/spimsal/malref.html

Che e' l'equivalente della malloc del C, dopodichè devi iterare per il numero di elementi che vuoi inserire nell'array e con un puntatore inizializzato al primo indirizzo dell'array ($v0) poi incrementi. Se hai delle basi di C sull'aritmetica dei puntatori bene, altrimenti consiglio di documentarti.

Testo quotato


E se poi devo stampare queste stringhe come faccio? Non posso usare il metodo 4 del system service per stampare questa stringa...

Sbaglio io a capire?



Si puoi usare il metodo 4. E' fatto proprio per questo scopo...

Ultima modifica effettuata da pierotofy il 24/05/2010 alle 19:19


Il mio blog: https://piero.dev
PM Quote
Avatar
DidyMond (Normal User)
Newbie


Messaggi: 16
Iscritto: 22/02/2010

Segnala al moderatore
Postato alle 14:58
Sabato, 29/05/2010
Ecco qua, ho aspettato un pò a risponderti perchè ho preferito avere chiarimenti anche dal mio professore...
Mi ha semplicemente detto che utilizzare una stringa sarebbe troppo lungo e rognoso, così mi ha suggerito di utilizzare un codice idenificativo per sapere cosa vuole inserire l'utente!
Beh, così effettivamente è più semplice e sono andato molto più avanti nel progetto!

Ora mi rimane da riordinare gli elementi nell'array (in modo crescente e viceversa) in modo ricorsivo.
E' possibile utilizzare la ricorsione per riordinare?

PM Quote
Avatar
crack001 (Normal User)
Rookie


Messaggi: 52
Iscritto: 25/10/2007

Segnala al moderatore
Postato alle 20:37
Sabato, 29/05/2010
Certo che puoi usare la ricorsione...devi solo gestirla sull'indice...parti dall'inizio e la richiami con l'indice incrementato...mi raccomando se usi la ricorsione devi utilizzare una funzione, e quindi devi ricordarti di salvare $ra dentro lo stack, io ti consiglio di farti uno schemetto del tuo stack su carta cosi capisci meglio i punti dove ritorni...io ho fatto una cosa simile con la ricerca binaria ma ti viene piu complicato

PM Quote
Avatar
DidyMond (Normal User)
Newbie


Messaggi: 16
Iscritto: 22/02/2010

Segnala al moderatore
Postato alle 17:37
Venerdì, 04/06/2010
Allora...piano piano ci sto riuscendo; riesco a riordinare un array ricorsivamente...

Però, quello che ora mi chiedo è se è possibile "associare" due array in quanto ho:
array1-->Prodotti (non stringhe ma codici)
array2-->Prezzi (floating)

Se io eseguo il sorting su array1 mi restituisce i codici prodotti ordinati, però se io devo stampare a video un "riepilogo" il prezzo-prodotto non corrisponde più

Non è che sia possibile "associare" i due array, cioè se io effettuo uno scambio nei prodotti mi scambia anche i prezzi?
come dovrei passare i dati al sorting?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 17:39
Venerdì, 04/06/2010
Nella procedura di sorting, quando scambi gli elementi dell'array prodotti scambia gli elementi corrispettivi dell'array prezzi. Ad esempio se stai scambiando il prodotto i con quello j, scambia anche il prezzo i con quello j.


Il mio blog: https://piero.dev
PM Quote
Avatar
DidyMond (Normal User)
Newbie


Messaggi: 16
Iscritto: 22/02/2010

Segnala al moderatore
Postato alle 19:00
Venerdì, 04/06/2010
Testo quotato

Postato originariamente da pierotofy:

Nella procedura di sorting, quando scambi gli elementi dell'array prodotti scambia gli elementi corrispettivi dell'array prezzi. Ad esempio se stai scambiando il prodotto i con quello j, scambia anche il prezzo i con quello j.  



Questo però vuol dire che per ogni operazione che faccio nel sorting dei prodotti lo devo fare anche in quello dei prezzi e quindi supponendo che:

Codice sorgente - presumibilmente Altri Linguaggi

  1. $t0->indirizzo base di array Prodotti
  2. $t1->indirizzo base di array Prezzi
  3.  
  4. Operazioni come queste (che nel sorting mi servono per avanzare di indice)
  5.  
  6. addi $t0, $t0, 4
  7.  
  8. Dovrei aggiungere anche
  9.  
  10. addi $t1, $t1, 4



Giusto? Il problema è che i registri scarseggiano perchè comunque dovrei prelevare sia i dati dell'array Prodotti che quello dei prezzi...o no?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 2:04
Sabato, 05/06/2010
Posta il codice completo... altrimenti non ti si può spiegare cosa bisogna fare; per la mancanza di registers io di solito risolvo utilizzando lo stack per allocare tutte le variabili locali (e anche per passare i parametri alle funzioni...)

Come in questo esempio: http://www.pierotofy.it/pages/sorgenti/dettagli/18486-Impl ...

All'inizio della tua procedura:

Codice sorgente - presumibilmente Plain Text

  1. addi    $sp, $sp, -4
  2. sw      $s0, 0($sp)
  3. move    $s0, $sp
  4.  
  5. # Create stack frame
  6. addi    $sp, $sp, -4



$s0 diventa il tuo "base pointer" che ti servirà da "puntatore di base" per accedere alle variabili locali. Dopodichè puoi utilizzare -4($s0) per fare utilizzare una variabile da 4 bytes. Ma ne puoi allocare quante ne vuoi. Ad esempio modificare:

Codice sorgente - presumibilmente Plain Text

  1. # Create stack frame
  2. addi    $sp, $sp, -4



Con:

Codice sorgente - presumibilmente Plain Text

  1. # Create stack frame
  2. addi    $sp, $sp, -12



Ti permette di utilizzare tre variabili da 4 bytes (oppure 1 da 12).

Per accedere alle variabili tramite lo stack:

Codice sorgente - presumibilmente Plain Text

  1. lw              $t0, 4($s0)



Poi prima di uscire dalla procedura è importante deallocare lo stack:

Codice sorgente - presumibilmente Plain Text

  1. move    $sp, $s0
  2. lw      $s0, 0($sp)
  3. addi    $sp, $sp, 4



Leggiti bene l'esempio che ho linkato e fatti uno schemino a matita dello stack, passo per passo come viene eseguito. Se analizzi bene il programma riuscirai anche a capire come è possibile passare parametri tramite lo stack.

Ultima modifica effettuata da pierotofy il 05/06/2010 alle 2:07


Il mio blog: https://piero.dev
PM Quote
Avatar
DidyMond (Normal User)
Newbie


Messaggi: 16
Iscritto: 22/02/2010

Segnala al moderatore
Postato alle 14:17
Sabato, 05/06/2010
Testo quotato

Postato originariamente da pierotofy:

Posta il codice completo... altrimenti non ti si può spiegare cosa bisogna fare



Si, in effetti senza codice risulta difficile sia per me spiegare sia per voi capire!
Ecco il codice: http://www.megaupload.com/?d=V8TJOAXC

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo